package my.soft.aiteacher.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
import my.soft.aiteacher.exception.BusinessException;
import my.soft.aiteacher.common.pojo.UserVo;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class JWTUtils {

    //用于签名的私钥
    private static final String PRIVATE_KEY = "17CS3Flight";
    //签发者
    private static final String ISS = "ok";

    //过期时间1小时
    private static final long EXPIRATION_ONE_HOUR = 3600L;
    //过期时间1天
    private static final long EXPIRATION_ONE_DAY = 604800L;

    /**
     * 生成Token
     *
     * @param user
     * @return
     */
    public static String createToken(UserVo user) {
        //Jwt头
        Map<String, Object> header = new HashMap<>();
        header.put("typ", "JWT");
        header.put("alg", "HS256");
        Map<String, Object> claims = new HashMap<>();
        //自定义有效载荷部分
        claims.put("username", user.getUsername());
        claims.put("password", user.getPassword());

        return Jwts.builder()
                //发证人
                .setIssuer(ISS)
                //Jwt头
                .setHeader(header)
                //有效载荷
                .setClaims(claims)
                //设定签发时间
                .setIssuedAt(new Date())
                //设定过期时间
//                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_ONE_HOUR * 1000))
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_ONE_DAY * 1000))
                //使用HS256算法签名，PRIVATE_KEY为签名密钥
                .signWith(SignatureAlgorithm.HS256, PRIVATE_KEY)
                .compact();
    }

    /**
     * 获取有效载荷
     *
     * @param token
     * @return
     */
    public static Claims verifyToken(String token) {
        try {
            return Jwts.parser()
                    // 设定解密私钥
                    .setSigningKey(PRIVATE_KEY)
                    // 传入Token
                    .parseClaimsJws(token)
                    // 获取载荷类
                    .getBody();
        } catch (ExpiredJwtException e) {
            log.error("Token 过期: {}", e.getMessage(), e);
            throw new BusinessException("token已过期");
        }
    }

}
